package com.design;

/**
 * 策略模式
 * Created by zhuangqi on 17-4-10.
 */
public class StrategyPattern {

    public static abstract class Duck{
        public FlyBehavior flyBehavior;
        public Duck() {
        }
        private void swim(){
            System.out.println("鸭子共性：游泳");
        }
        private void performFly(){
            flyBehavior.fly();  //通过属性赋予行为
        }
        //通过注入方式动态改变鸭子的行为
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
        //不同种类的鸭子通过继承父类，自定义display方法
        abstract void display();
    }

    /**
     * 将飞行行为抽象出来
     * 这里要注意，不要在抽出来的飞行行为中实现具体对象的飞行行为（即面向实现编程）
     * 将飞行行为抽为一个接口，每个具体的对象根据自身情况实现飞行行为（即面向接口编程）
     */
    interface FlyBehavior{
        void fly();
    }

    /**
     * 具体实现
     */
    static class flyDuck implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("飞行行为：我是只会飞的鸭子");
        }
    }
    static class GreenDuck extends Duck{
        //通过构造函数初始化鸭子的飞行行为
        public GreenDuck() {
            flyBehavior = new flyDuck();
        }
        @Override
        void display() {
            System.out.println("我是绿色的鸭子");
        }
    }

    /**
     * 测试
     */
    public static void main(String[] args) {
        Duck duck = new GreenDuck();
        duck.performFly();
    }
}
